#include "app_common.h"

/**
 * 获取当前时间戳(毫秒数)
 */
long app_common_GetCurrentTime(void)
{
    // 定义结构体对象用于接收时间数据
    struct timeval ts_val;

    // 获取当天当前时间的时间戳
    gettimeofday(&ts_val, NULL);

    // 计算时间戳并返回
    return ts_val.tv_sec * 1000 + ts_val.tv_usec / 1000;
}

/**
 * @brief 转换为十六进制数组
 * @param chars_buff     字符数组     "abcd"
 * @param chars_buff_len 字符数组长度
 * @return 十六进制数组                [61626364]
 */
char *app_common_charsToHexStr(char *chars_buff, int chars_buff_len)
{
    // 1.申请使用的内存
    char *hex_str = malloc(chars_buff_len * 2 + 1);

    // 2.遍历字符数组,将每个字符转换为十六进制
    for (int i = 0; i < chars_buff_len; i++)
    {
        sprintf(hex_str + i * 2, "%02X", chars_buff[i]);
    }

    // 3.补充结束符
    hex_str[chars_buff_len * 2] = '\0';

    // 4.返回结果
    return hex_str;
}

/**
 * @brief 将十六进制数组转换为字符数组
 * @param hex_str       十六进制数组     [61626364]
 * @param hex_str_len   十六进制数组长度
 * @return 字符数组                     "abcd"
 */
char *app_common_HexStrToChar(char *hex_str, int hex_str_len)
{
    // 1.申请字符数组空间
    char *chars_buff = malloc(hex_str_len / 2 + 1);

    // 2.遍历十六进制数组
    for (int i = 0; i < hex_str_len; i += 2)
    {
        sscanf(hex_str + i, "%02X", (unsigned int *)(chars_buff + i / 2));
    }

    chars_buff[hex_str_len / 2] = '\0';

    // 3.返回结果
    return chars_buff;
}